/**
 * Copyright(c) 2013 Jade Techonologies Co., Ltd.
 *
 * History:
 *   13-4-28 下午1:42 Created by dwzhang
 */
package com.jade.framework.startup.def;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

/**
 * <Host>的定义。
 *
 * @author dwzhang
 * @version 1.0 13-4-28 下午1:42
 */
public class HostDefinition
{
    private String name;
    private transient String address;
    private String[] addresses;
    private List<String> servers = new ArrayList<String>();
    //    private SortedMap<String, ServerDefinition> servers = new TreeMap<String, ServerDefinition>();

    private transient SystemDefinition systemDef = SystemDefinition.getInstance();

    /**
     * 返回主机名.
     *
     * @return 主机名
     */
    public String getName()
    {
        return name;
    }

    /**
     * 返回主机地址.
     *
     * @return 主机地址
     */
    public String getAddress()
    {
        return address;
    }

    /**
     * 返回主机地址，主机可用的IP地址，这个方法适合于一个主机在两个网段内，需要在不同网段内的服务进行通讯.
     * 多个IP地址的第一个作为服务器的唯一标识。
     *
     * @return 主机可用的IP地址
     */
    public String[] getAddresses()
    {
        return addresses;
    }

    /**
     * 返回所有服务器
     *
     * @return 所有服务器
     */
    public ServerDefinition[] getServers()
    {
        //Set<String> keys = servers.keySet();
        ServerDefinition[] defs = new ServerDefinition[servers.size()];
        int i = 0;
        for (String server : servers) {
            defs[i] = systemDef.getServer(server);
            i++;
        }
        return defs;
    }

    /**
     * 根据服务器类型返回服务器
     *
     * @param type 类型
     * @return 服务器定义
     */
    public ServerDefinition getServer(String type)
    {
        return systemDef.getServer(type);
    }

    /**
     * 设置主机名
     *
     * @param name 主机名称
     */
    public void setName(String name)
    {
        this.name = name;
    }

    /**
     * 设置地址
     *
     * @param address 地址
     */
    public void setAddress(String address)
    {
        this.addresses = StringUtils.split(address, ',');
        if (addresses == null || addresses.length == 0) {
            throw new IllegalArgumentException("No 'address' attribute");
        }
        this.address = addresses[0];
    }

    /**
     * 添加服务器定义
     *
     * @param serverType 服务器类型
     */
    public void addServer(String serverType)
    {
        servers.add(serverType);
        //String type = server.getType();
        //        ServerDefinition serverDef = systemDef.getServer(type);
        //        if (serverDef == null) {
        //            throw new IllegalArgumentException("No such server definied:" + type);
        //        }
        //        //如果没有特殊的定义，将服务器的定义添加进去
        //        servers.put(type, serverDef);
    }
}
